perm filename WIX3LB.SAI[VIS,HPM] blob sn#178250 filedate 1975-10-12 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	entry normalize, synchronize,diminterest,interest
C00005 00003	internal INTEGER PROCEDURE diminterest(REFERENCE INTEGER PICTURE INTEGER IW)
C00010 ENDMK
C⊗;
entry normalize, synchronize,diminterest,interest;
begin

require "pixnic.sai" source_file;

EXTERNAL INTEGER PROCEDURE INTRST(REFERENCE INTEGER PICTURE;
				INTEGER WINSIZ;
				REFERENCE INTEGER RESULTARRY);

EXTERNAL PROCEDURE GETPAR(REFERENCE INTEGER ARRY, PICTR);

EXTERNAL PROCEDURE PERBIT(REFERENCE INTEGER PICTURE, PERMUTATION);
EXTERNAL PROCEDURE HISTOG(REFERENCE INTEGER PICTURE, HISTOGRAM);

EXTERNAL PROCEDURE ROWSUM(REFERENCE INTEGER PICTURE, RWSUM);
EXTERNAL PROCEDURE ROWSUD(REFERENCE INTEGER PICTURE, RWSUM);

EXTERNAL INTEGER PROCEDURE CMPPAR(REFERENCE INTEGER PIC1,PIC2);

EXTERNAL INTEGER PROCEDURE BSTCOR(REFERENCE INTEGER PIC1,SY1,SX1,SY2,SX2;
				REFERENCE INTEGER PIC2,DY1,DX1,DY2,DX2);
EXTERNAL PROCEDURE CLEAN(REFERENCE INTEGER PICTURE);
EXTERNAL PROCEDURE PASSHI(REFERENCE INTEGER PICTURE1;
				INTEGER WINSIZ;
				REFERENCE INTEGER PICTURE2);
EXTERNAL PROCEDURE HAFPIC(REFERENCE INTEGER PICTURE1,PICTURE2; INTEGER MAXBIT);
EXTERNAL PROCEDURE COPPIC(REFERENCE INTEGER PICTURE1,PICTURE2);
EXTERNAL INTEGER PROCEDURE MATCH(REFERENCE INTEGER PIC1,SY1,SX1,SY2,SX2;
				REFERENCE INTEGER PIC2,DY1,DX1,DY2,DX2);

EXTERNAL PROCEDURE UNPACK(REFERENCE INTEGER SOURCEARRAY, PICTURE);
EXTERNAL PROCEDURE SELECT(REFERENCE INTEGER PICT1; INTEGER YEDGE,XEDGE; 
				REFERENCE INTEGER PICT2);
internal INTEGER PROCEDURE diminterest(REFERENCE INTEGER PICTURE; INTEGER IW);
   BEGIN
   INTEGER HIG,WID,BITS;
   HIG←MEMORY[LOCATION(PICTURE)+PCLN];
   WID←MEMORY[LOCATION(PICTURE)+LNBY];
   BITS←MEMORY[LOCATION(PICTURE)+BYBI];
   RETURN(PIXDIM((HIG-1)%IW,(WID-1)%IW,10));
   END;

internal PROCEDURE INTEREST(REFERENCE INTEGER PICTURE; INTEGER IW;
				REFERENCE INTEGER RESULT);
   BEGIN
   INTEGER HIG,WID,BITS,IAV,I,J,IWW,BYMAX;
   EXTERNAL PROCEDURE GETPAR(REFERENCE INTEGER ARY, PICT);

   HIG←MEMORY[LOCATION(PICTURE)+PCLN];
   WID←MEMORY[LOCATION(PICTURE)+LNBY];
   BITS←MEMORY[LOCATION(PICTURE)+BYBI];

      BEGIN
      INTEGER ARRAY INTER[-2:(HIG-1)%IW-1,0:(WID-1)%IW-1];
      IAV←INTRST(PICTURE,IW,INTER[0,0]);
      IWW←IW*IW;
      BYMAX←2↑BITS-1;
      FOR I←(HIG-1)%IW-1 STEP -1 UNTIL 0 DO
      FOR J←(WID-1)%IW-1 STEP -1 UNTIL 0 DO
         INTER[I,J]←8*SQRT(INTER[I,J]/IWW) MIN BYMAX;
      MAKPIX((HIG-1)%IW,(WID-1)%IW,BITS,RESULT);
      GETPAR(INTER[0,0],RESULT);
      END;
   END;

internal PROCEDURE NORMALIZE(REFERENCE INTEGER PIC);
   BEGIN
   INTEGER INTEG,I,TOT,BITS,SAMPS;
   BITS←MEMORY[LOCATION(PIC)+BYBI];
   SAMPS←2↑BITS;
      BEGIN
      INTEGER ARRAY GREYS[0:SAMPS-1];

      HISTOG(PIC,GREYS[0]);

      TOT←0;
      FOR I←0 STEP 1 UNTIL SAMPS-1 DO TOT←TOT+GREYS[I];

      INTEG←0;
      FOR I←0 STEP 1 UNTIL SAMPS-1 DO
         BEGIN
         INTEG←INTEG+GREYS[I];
         GREYS[I]←(SAMPS-1)*INTEG/TOT;
         END;

      PERBIT(PIC,GREYS[0]);
      END;
   END;

internal PROCEDURE SYNCHRONIZE(REFERENCE INTEGER PIC);
   BEGIN
   INTEGER I,J,K,WINVAL,WINPOS,HIG;
   HIG←MEMORY[LOCATION(PIC)+PCLN];
      BEGIN
      INTEGER ARRAY ROWSM[0:HIG-1];
      INTEGER RETRACE,TRIALVAL;

      ROWSUD(PIC,ROWSM[0]);

      RETRACE←HIG%19;
      WINPOS←RETRACE-1;
      WINVAL←0;
      FOR I←0 STEP 1 UNTIL WINPOS DO WINVAL←WINVAL+ROWSM[I];
      TRIALVAL←WINVAL;
      FOR J←RETRACE STEP 1 UNTIL HIG+RETRACE-1 DO
         BEGIN
         INTEGER JJ;
         JJ←J MOD HIG;
         TRIALVAL←TRIALVAL-ROWSM[J-RETRACE]+ROWSM[JJ];
         IF TRIALVAL≤WINVAL THEN
            BEGIN
            WINVAL←TRIALVAL;
            WINPOS←JJ;
            END;
         END;
      END;

   IF WINPOS<HIG-1 THEN
      BEGIN
      INTEGER BODY,BODYSIZ;
      INTEGER ARRAY COPY[0:BODYSIZ←MEMORY[LOCATION(PIC)+PCWD]];

      BODY←MEMORY[LOCATION(PIC)+LINTAB];
      WINPOS←WINPOS*MEMORY[LOCATION(PIC)+LNWD];

      ARRBLT(COPY[0],MEMORY[BODY+WINPOS],BODYSIZ-WINPOS);
      ARRBLT(COPY[BODYSIZ-WINPOS],MEMORY[BODY],WINPOS);
      ARRBLT(MEMORY[BODY],COPY[0],BODYSIZ);
      END;
    END;

end